/**
 * 装饰器模式：在不改变原对象的基础上，通过对其进行包装拓展，使原有对象可以满足用户更复杂需求
 */


// 单一职责原则

// ES7 装饰器
// 装饰器函数，第一个参数为目标类
function classDecorator(target) {
    target.hasDecorator = true;
    return target;
}
//将装饰器安装到button上
@classDecorator
class Button {}

console.log('Button被装饰了', Button.hasDecorator);

function classDecorator(target) {
    target.hasDecorator = true;
    return target;
  }
  
  // @classDecorator
  // class Button {}
  
  // console.log('button', Button.hasDecorator);
  
  function funcDecorator(target, name, descriptor) {
    console.log('target', target);
    console.log('name', name);
    let originalMethod = descriptor.value;
    descriptor.value = function() {
      console.log('fun装饰器');
      return originalMethod.apply(this, arguments);
    }
    return descriptor;
  }
  
  class Button {
    @funcDecorator
    onClick() {
      console.log('原有逻辑');
    }
  }
  
  const btn = new Button();
  btn.onClick();